home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / groff_src.lha / Groff-1.07 / mm / tmac.m < prev    next >
Text File  |  1993-03-03  |  56KB  |  2,501 lines

  1. .\"    Version:
  2. .ds RE 1.11
  3. .ig
  4.  
  5. Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
  6. mgm is written by Jörgen Hägg (jh@efd.lth.se)
  7.  
  8. mgm is free software; you can redistribute it and/or modify it under
  9. the terms of the GNU General Public License as published by the Free
  10. Software Foundation; either version 2, or (at your option) any later
  11. version.
  12.  
  13. mgm is distributed in the hope that it will be useful, but WITHOUT ANY
  14. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License along
  19. with groff; see the file COPYING.  If not, write to the Free Software
  20. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. Almost complete. The letter format is not included.
  23. Maybe as a separate package.
  24. Should be better as time goes.
  25.  
  26. Please send bugreports with examples to jh@efd.lth.se.
  27.  
  28. Naming convention stolen from mgs.
  29. Local names    module*name
  30. Extern names    module@name
  31. Env.var        environ:name
  32. Index        array!index
  33. ..
  34. .warn
  35. .\" ####### init ######
  36. .\"    Contents level [0:7], contents saved if heading level <= Cl
  37. .nr Cl 2
  38. .\"    Eject page between LIST OF XXXX if Cp == 0
  39. .nr Cp 0
  40. .\"    Debugflag
  41. .if !r D .nr D 0
  42. .\"    Eject after floating display is output [0:1]
  43. .nr De 0
  44. .\"    Floating keep output [0;5]
  45. .nr Df 5
  46. .\"    space before and after display if == 1 [0:1]
  47. .nr Ds 1
  48. .\"    Eject page
  49. .nr Ej 0
  50. .\"    Eqation lable adjust 0=left, 1=right
  51. .nr Eq 0
  52. .\"    Em dash string
  53. .ds EM \-
  54. .\"    Footnote spacing
  55. .nr Fs 1
  56. .\"    H1-H7    heading counters
  57. .nr H1 0 1
  58. .nr H2 0 1
  59. .nr H3 0 1
  60. .nr H4 0 1
  61. .nr H5 0 1
  62. .nr H6 0 1
  63. .nr H7 0 1
  64. .\"    Heading break level [0:7]
  65. .nr Hb 2
  66. .\"    heading centering level, [0:7]
  67. .nr Hc 0
  68. .\"    header format
  69. .ds HF 2 2 2 2 2 2 2
  70. .\"    heading temp. indent [0:2]
  71. .\"    0 -> 0 indent, left margin
  72. .\"    1 -> indent to right , like .P 1
  73. .\"    2 -> indent to line up with text part of preceding heading
  74. .nr Hi 1
  75. .\"    header pointsize
  76. .ds HP 0 0 0 0 0 0 0
  77. .\"    heading space level [0:7]
  78. .nr Hs 2
  79. .\"    heading numbering type
  80. .\"    0 -> multiple (1.1.1 ...)
  81. .\"    1 -> single
  82. .nr Ht 0
  83. .\"    Unnumbered heading level
  84. .nr Hu 2
  85. .\"    hyphenation in body
  86. .\"    0 -> no hyphenation
  87. .\"    1 -> hyphenation 14 on
  88. .nr Hy 1
  89. .\"    text for toc, selfexplanatory. Look in the new variable section
  90. .ds Lf LIST OF FIGURES
  91. .nr Lf 1
  92. .ds Lt LIST OF TABLES
  93. .nr Lt 1
  94. .ds Lx LIST OF EXHIBITS
  95. .nr Lx 1
  96. .ds Le LIST OF EQUATIONS
  97. .nr Le 0
  98. .\"    List indent, used by .AL
  99. .nr Li 6
  100. .\"    List space, if listlevel > Ls then no spacing will occur around lists.
  101. .nr Ls 99
  102. .\"    Numbering style [0:5]
  103. .if !r N .nr N 0
  104. .\"    numbered paragraphs
  105. .\"    0 == not numbered
  106. .\"    1 == numbered in first level headings.
  107. .nr Np 0
  108. .\"    Format of figure,table,exhibit,equation titles.
  109. .\"    0= ". ", 1=" - "
  110. .nr Of 0
  111. .\"    Page-number, normally same as %.
  112. .nr P 0
  113. .\"    paragraph indent
  114. .nr Pi 5
  115. .\"    paragraph spacing
  116. .nr Ps 1
  117. .\"    paragraph type
  118. .\"    0 == left-justified
  119. .\"    1 == indented .P
  120. .\"    2 == indented .P except after .H, .DE or .LE.
  121. .nr Pt 0
  122. .\"    Reference title
  123. .ds Rp REFERENCES
  124. .\"    Display indent
  125. .nr Si 5
  126. .\"
  127. .ds Tm \(tm
  128. .\"
  129. .\"---------------------------------------------
  130. .\"    Internal global variables
  131. .\"
  132. .\" These two are for cover macro .MT
  133. .\" Change @langage in the national file.
  134. .ds @cur-lib /usr/local/lib/groff/tmac
  135. .\" .ds @language
  136. .\"
  137. .\"    Current pointsize and vertical space, always in points.
  138. .nr @ps 10
  139. .nr @vs 12
  140. .\"    Page length
  141. .ie r L .nr @pl \n[L]
  142. .el .nr @pl 11i
  143. .\"    page width
  144. .ie r W .nr @ll \n[W]
  145. .el .nr @ll 6i
  146. .\"    page offset
  147. .ie r O .nr @po \n[O]
  148. .el .nr @po 1i
  149. .\"
  150. .\" cheating...
  151. .pl \n[@pl]u
  152. .ll \n[@ll]u
  153. .lt \n[@ll]u
  154. .po \n[@po]u
  155. .nr @cur-ll \n[@ll]
  156. .\"
  157. .\" non-zero if escape mechanism is turned off. Used by VERBON/OFF
  158. .nr @verbose-flag 0
  159. .\"---------------------------------------------
  160. .\"    New variables
  161. .\"
  162. .\" Appendix name
  163. .ds App APPENDIX
  164. .\" print appendixheader, 0 == don't
  165. .nr Aph 1
  166. .\"
  167. .\" header prespace level. If level <= Hps, then two lines will be printed
  168. .\" before the header instead of one.
  169. .nr Hps 1
  170. .\"
  171. .\" These variables controls the number of lines preceding .H.
  172. .\" Hps1 is the number of lines when level > Hps
  173. .nr Hps1 0.5v
  174. .if n .nr Hps1 1v
  175. .\"
  176. .\" Hps2 is the number of lines when level >= Hps
  177. .nr Hps2 1v
  178. .if n .nr Hps2 2v
  179. .\"
  180. .\" flag for mkindex
  181. .if !r Idxf .nr Idxf 0
  182. .\"    Change these in the national configuration file
  183. .ds Lifg Figure
  184. .ds Litb TABLE
  185. .ds Liex Exhibit
  186. .ds Liec Equation
  187. .ds Licon CONTENTS
  188. .\"
  189. .\" Lsp controls the height of an empty line. Normally 0.5v
  190. .\" Normally used for nroff compatibility.
  191. .nr Lsp 0.5v
  192. .if n .nr Lsp 1v
  193. .ds MO1 January
  194. .ds MO2 February
  195. .ds MO3 March
  196. .ds MO4 April
  197. .ds MO5 May
  198. .ds MO6 June
  199. .ds MO7 July
  200. .ds MO8 August
  201. .ds MO9 September
  202. .ds MO10 October
  203. .ds MO11 November
  204. .ds MO12 December
  205. .\" for GETR
  206. .ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp].
  207. .\"    test for mgm macro. This can be used if the text must test
  208. .\"    what macros is used.
  209. .\"
  210. .\" section-page if Sectp > 0
  211. .nr Sectp 0
  212. .if (\n[N]=3):(\n[N]=5) \{\
  213. .    nr Sectp 1
  214. .    nr Ej 1
  215. .\}
  216. .\" section-figure if Sectf > 0
  217. .nr Sectf 0
  218. .if \n[N]=5 .nr Sectf 1
  219. .nr .mgm 1
  220. .\"
  221. .\"---------------------------------------------
  222. .\" set local variables.
  223. .ie d @language .mso mm/\\*[@language]_locale
  224. .el .mso mm/locale
  225. .\"---------------------------------------------
  226. .if \n[D] .tm Groff mm, version \*[RE].
  227. .\" ####### module init ######
  228. .\"    reset all things
  229. .de init@reset
  230. .ie \\n[misc@adjust] 'ad
  231. .el 'na
  232. .ie \\n[Hy] 'hy 14
  233. .el 'nh
  234. 'in 0
  235. 'ti 0
  236. 'ps \\n[@ps]
  237. 'vs \\n[@vs]
  238. ..
  239. .de @error
  240. .tm ******************
  241. .tm ERROR:(\\n[.F]) input line \\n[.c]:\\$*
  242. .if \\n[D] .backtrace
  243. .tm ******************
  244. .ab
  245. ..
  246. .\" ####### module debug #################################
  247. .de debug
  248. .tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \
  249. in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
  250. ..
  251. .de debug-all
  252. .nr debug*n 1n
  253. .nr debug*m 1m
  254. .tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\
  255.  ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o]
  256. .tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\
  257.  .p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
  258. ..
  259. .\" ####### module par #################################
  260. .nr par@ind-flag 1    \" indent on following P if Pt=2
  261. .nr hd*last-pos -1
  262. .nr hd*last-hpos -1
  263. .nr par*number 0 1
  264. .af par*number 01
  265. .nr par*num-count 0 1
  266. .af par*num-count 01
  267. .\"    reset numbered paragraphs, arg1 = headerlevel
  268. .de par@reset-num
  269. .if \\$1<3 .nr par*num-count 0
  270. .if (\\$1=1)&(\\n[Np]=1) .nr par*number 0
  271. ..
  272. .\"------------
  273. .\" paragraph
  274. .de P
  275. .\"    skip P if previous heading
  276. .ie !((\\n[nl]=\\n[hd*last-pos]):(\\n[nl]=(\\n[hd*last-pos]-.5v))) \{\
  277. .    if \\n[D]>2 .tm Paragraph 
  278. .    par@doit \\$*
  279. .\}
  280. .el .if !(\\n[hd*last-hpos]=\\n[.k]) \{\
  281. .    if \\n[D]>2 .tm Paragraph 
  282. .    par@doit \\$*
  283. .\}
  284. .nr par@ind-flag 1
  285. ..
  286. .de par@doit
  287. .SP (u;\\n[Ps]*\\n[Lsp])
  288. .ie  \\n[.$] \{\
  289. .    if \\$1=1 .ti +\\n[Pi]n
  290. .\}
  291. .el \{\
  292. .    if \\n[Pt]=1 .ti +\\n[Pi]n
  293. .    if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
  294. .\}
  295. .if \\n[Np] \{\
  296. \\n[H1].\\n+[par*number]\ \ \c
  297. .\" $$$ 'br
  298. .\}
  299. ..
  300. .\" ####### module line #######################################
  301. .de SP
  302. .br
  303. .if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0
  304. .if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0
  305. .ie \\n[.$] .nr line*temp (v;\\$1)
  306. .el .nr line*temp 1v
  307. .\"
  308. .ie \\n[line*lp\\n[.z]]=\\n[.d] \{\
  309. .    \" go here if no output since the last .SP
  310. .    nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]]
  311. .    if \\n[line*output]<0 .nr line*output 0
  312. .    nr line*ac\\n[.z] +\\n[line*output]
  313. .\}
  314. .el \{\
  315. .    nr line*ac\\n[.z] \\n[line*temp]
  316. .    nr line*output \\n[line*temp]
  317. .    \" no extra space in the beginning of a page
  318. .    if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0
  319. .\}
  320. .if \\n[line*output] .sp \\n[line*output]u
  321. .nr line*lp\\n[.z] \\n[.d]
  322. ..
  323. .\" ######## module misc ###############
  324. .nr misc@adjust 14
  325. .de SA
  326. .if \\n[.$] \{\
  327. .    if \\$1-1 .@error "SA: bad arg: \\$1"
  328. .    nr misc@adjust 0\\$1
  329. .\}
  330. .ie \\n[misc@adjust] 'ad
  331. .el 'na
  332. ..
  333. .\"-------------
  334. .\" switch environment, keep all important settings.
  335. .de misc@ev-keep
  336. .nr misc*ll \\n[.l]
  337. .ev \\$1
  338. .ll \\n[misc*ll]u
  339. .lt \\n[misc*ll]u
  340. ..
  341. .\"-------------
  342. .\" .misc@push stackname value
  343. .de misc@push
  344. .ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1]
  345. .el .ds misc*st-\\$1 \\$2
  346. ..
  347. .\"-------------
  348. .\" .misc@pop stackname
  349. .\" value returned in the string misc*pop
  350. .de misc@pop
  351. .misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1]
  352. ..
  353. .\"-------------
  354. .de misc@pop-set
  355. .ds misc*st-name \\$1
  356. .shift
  357. .if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty"
  358. .ds misc*pop \\$1
  359. .shift
  360. .ds \\*[misc*st-name] \\$*
  361. ..
  362. .\"-------------
  363. .\" .misc@pop-nr stackname varname
  364. .de misc@pop-nr
  365. .misc@pop \\$1
  366. .nr \\$2 \\*[misc*pop]
  367. ..
  368. .\"-------------
  369. .\" .misc@pop-ds stackname varname
  370. .de misc@pop-ds
  371. .misc@pop \\$1
  372. .ds \\$2 \\*[misc*pop]
  373. ..
  374. .\"-----------
  375. .\" reset tabs
  376. .de TAB
  377. .ta T 5n
  378. ..
  379. .\"-------------
  380. .\" .PGFORM linelength [ pagelength [ pageoffset ] ]
  381. .de PGFORM
  382. .if !''\\$1' .nr @ll \\$1
  383. .if !''\\$2' .nr @pl \\$2
  384. .if !''\\$3' .nr @po \\$3
  385. .ll \\n[@ll]u
  386. .lt \\n[@ll]u
  387. .po \\n[@po]u
  388. .pl \\n[@pl]u
  389. .nr @cur-ll \\n[@ll]
  390. .in 0
  391. .pg@move-trap
  392. ..
  393. .\"-------------
  394. .\" .MOVE y [[x] linelength]
  395. .\" move to line y, indent to x
  396. .de MOVE
  397. .if !\\n[.$] .@error "MOVE y [x]: no arguments"
  398. .if \\n[nl]<0 \c
  399. .\" move to Y-pos
  400. .sp |(v;\\$1)
  401. .\" calc linelength
  402. .ie \\n[.$]>2 .nr pg*i (n;\\$3)
  403. .el \{\
  404. .    ie \\n[.$]>1 .nr pg*i (n;\\n[@ll]u-\\$2)
  405. .    el .nr pg*i \\n[@ll]u
  406. .\}
  407. .\" move to X-pos, if any
  408. .if !''\\$2' .po \\$2
  409. .\" set linelength
  410. .ll \\n[pg*i]u
  411. ..
  412. .\"-------------
  413. .de SM
  414. .if !\\n[.$] .@error "SM: no arguments"
  415. .if \\n[.$]=1 \s-1\\$1\s0
  416. .if \\n[.$]=2 \s-1\\$1\s0\\$2
  417. .if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3
  418. ..
  419. .\"-------------
  420. .nr misc*S-ps \n[@ps]
  421. .nr misc*S-vs \n[@vs]
  422. .nr misc*S-ps1 \n[@ps]
  423. .nr misc*S-vs1 \n[@vs]
  424. .ds misc*a
  425. .ds misc*b
  426. .de S
  427. .ie !\\n[.$] \{\
  428. .    ds misc*a P
  429. .    ds misc*b P
  430. .\}
  431. .el \{\
  432. .    ie \\n[.$]=1 .ds misc*b D
  433. .    el \{\
  434. .        ie \w@\\$2@=0 .ds misc*b C
  435. .        el .ds misc*b \\$2
  436. .    \}
  437. .    ie \w@\\$1@=0 .ds misc*a C
  438. .    el .ds misc*a \\$1
  439. .\}
  440. .\" set point size
  441. .if !'\\*[misc*a]'C' \{\
  442. .    ie '\\*[misc*a]'P' .nr @ps \\n[misc*S-ps]
  443. .    el \{\
  444. .        ie '\\*[misc*a]'D' .nr @ps 10
  445. .        el .nr @ps \\*[misc*a]
  446. .    \}
  447. .\}
  448. .\" set vertical spacing
  449. .if !'\\*[misc*b]'C' \{\
  450. .    ie '\\*[misc*b]'P' .nr @vs \\n[misc*S-vs]
  451. .    el \{\
  452. .        ie '\\*[misc*b]'D' .nr @vs \\n[@ps]+2
  453. .        el .nr @vs \\*[misc*b]
  454. .    \}
  455. .\}
  456. 'ps \\n[@ps]
  457. 'vs \\n[@vs]
  458. .if \\n[D]>1 .tm point-size \\n[@ps] (\\n[.s]), vertical spacing \\n[@vs] (\\n[.v])
  459. .nr misc*S-ps \\n[misc*S-ps1]
  460. .nr misc*S-vs \\n[misc*S-vs1]
  461. .nr misc*S-ps1 \\n[@ps]
  462. .nr misc*S-vs1 \\n[@vs]
  463. ..
  464. .\"------------
  465. .de HC
  466. .ev 0
  467. .hc \\$1
  468. .ev
  469. .ev 1
  470. .hc \\$1
  471. .ev
  472. .ev 2
  473. .hc \\$1
  474. .ev
  475. ..
  476. .\"------------
  477. .de RD
  478. .di misc*rd
  479. 'fl
  480. .rd \\$1
  481. .br
  482. .di
  483. .ie !''\\$3' \{\
  484. .    di misc*rd2
  485. .    ds \\$3 "\\*[misc*rd]
  486. .    br
  487. .    di
  488. .\}
  489. .if !''\\$2' .rn misc*rd \\$2
  490. .rm misc*rd misc*rd2
  491. ..
  492. .\"------------
  493. .\" VERBON [escape on/off [pointsize [font]]]
  494. .de VERBON
  495. .br
  496. .misc@ev-keep misc*verb-ev
  497. .nf
  498. .ie !'\\$3'' .ft \\$3
  499. .el .ft CR
  500. .ss 12
  501. .ta T 8u*\w@n@u
  502. .if 0\\$2 \{\
  503. .    ps \\$2
  504. .    vs \\$2
  505. .\}
  506. .nr @verbose-flag 1        \" tell pageheader to set ec/eo
  507. .if !0\\$1 .eo
  508. ..
  509. .de VERBOFF
  510. .ec
  511. .ev
  512. .nr @verbose-flag 0
  513. ..
  514. .\" ######## module acc #################
  515. .\"-----------
  516. .\" accents. These are copied from mgs, written by James Clark.
  517. .de acc@over-def
  518. .ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
  519. \h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
  520. ..
  521. .de acc@under-def
  522. .ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
  523. ..
  524. .acc@over-def ` \`
  525. .acc@over-def ' \'
  526. .acc@over-def ^ ^
  527. .acc@over-def ~ ~
  528. .acc@over-def : \(ad
  529. .acc@over-def ; \(ad
  530. .acc@under-def , \(ac
  531. .\" ######## module uni #################
  532. .\" unimplemented macros
  533. .de OK
  534. .tm "OK: not implemented"
  535. ..
  536. .de PM
  537. .tm "PM: not implemented"
  538. ..
  539. .\" ######## module hd #################
  540. .\" support for usermacro
  541. .nr hd*h1-page 1    \" last page-number for level 1 header.
  542. .nr hd*htype 0
  543. .ds hd*sect-pg
  544. .ds hd*mark
  545. .ds hd*suf-space
  546. .nr hd*need 0
  547. .aln ;0 hd*htype
  548. .als }0 hd*mark
  549. .als }2 hd*suf-space
  550. .aln ;3 hd*need
  551. .\"-------------
  552. .\" .hd@split varable index name val1 val2 ...
  553. .de hd@split
  554. .if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
  555. .nr hd*sp-tmp \\$2+3
  556. .ds \\$1 \\$[\\n[hd*sp-tmp]]
  557. ..
  558. .de HU
  559. .H 0 "\\$1"
  560. ..
  561. .\"-------------
  562. .de H
  563. .if !r hd*cur-bline .nr hd*cur-bline \\n[nl]
  564. .br
  565. .ds@print-float 2\"    $$$ could be wrong...
  566. .\" terminate all lists
  567. .LC 0
  568. .init@reset
  569. .nr hd*level 0\\$1
  570. .nr hd*arg1 0\\$1
  571. .if !\\n[hd*level] .nr hd*level \\n[Hu]
  572. .\"
  573. .\"    clear lower counters
  574. .nr hd*i 1 1
  575. .while \\n+[hd*i]<8 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
  576. .\"
  577. .\"    Check if it's time for new page. Only if text has
  578. .\"    appeared before.
  579. .if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page
  580. .\"
  581. .\" increment current counter
  582. .nr H\\n[hd*level] +1
  583. .\"
  584. .\" if level==1 -> prepare for new section.
  585. .if \\n[hd*level]=1 .rr hd*h1-page
  586. .\"
  587. .\"
  588. .\" hd*mark is the text written to the left of the header.
  589. .ds hd*mark \\n[H1].
  590. .\"
  591. .if \\n[hd*level]>1 .as hd*mark \\n[H2]
  592. .\"
  593. .nr hd*i 2 1
  594. .while \\n+[hd*i]<8 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
  595. .if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
  596. .\"
  597. .\" toc-mark is sent to the table of contents
  598. .ds hd*toc-mark \\*[hd*mark]
  599. .as hd*mark \ \ \"            add spaces between mark and heading
  600. .if !\\n[hd*arg1] \{\
  601. .    ds hd*mark\"        no mark for unnumbered
  602. .    ds hd*toc-mark
  603. .\}
  604. .\"
  605. .if \\n[D]>1 .tm At header \\*[hd*toc-mark] "\\$2"
  606. .nr hd*htype 0                \" hd*htype = check break and space
  607. .                    \" 0 = run-in, 1 = break only, 2 = space
  608. .if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
  609. .if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
  610. .                    \" two spaces if hd*htype == 0
  611. .ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space "  \"
  612. .el .ds hd*suf-space
  613. .nr hd*need 2v                \" hd*need = header need space
  614. .if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \"    add some extra space
  615. .\"---------- user macro HX ------------
  616. .\" User exit macro to override numbering.
  617. .\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3)
  618. .\" Can also change Hps1/2.
  619. .if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
  620. .\"-------------------------------------- 
  621. .\" pre-space
  622. .ie \\n[hd*level]<=\\n[Hps] .SP \\n[Hps2]u
  623. .el .SP \\n[Hps1]u
  624. .\"
  625. .par@reset-num \\n[hd*level]\"            reset numbered paragraph
  626. .\" start diversion to measure size of header
  627. .di hd*div
  628. \\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
  629. .br
  630. .di
  631. .rm hd*div
  632. .ne \\n[hd*need]u+\\n[dn]u+.5p  \"    this is the needed space for a header
  633. .if \\n[hd*htype] .na \"        no adjust if run-in
  634. .\"
  635. .\" size and font calculations
  636. .hd@split hd*font \\n[hd*level] HF \\*[HF]\"    get font for this level
  637. .ft \\*[hd*font]\"            set new font
  638. .hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\"    get point size
  639. .ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
  640. .    if \\n[hd*htype] \{\
  641. .        if '\\*[hd*font]'3' .S -1
  642. .        if '\\*[hd*font]'B' .S -1
  643. .    \}
  644. .\}
  645. .el .S \\*[hd*new-ps]
  646. .\"
  647. .\"---------- user macro HY ------------- 
  648. .\"    user macro to reset indents
  649. .if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
  650. .\"-------------------------------------- 
  651. .nr hd*mark-size \w@\\*[hd*mark]@
  652. .if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
  653. .\"
  654. .\"    finally, output the header
  655. \\*[hd*mark]\&\c
  656. .\"    and the rest of the header
  657. .ie \\n[hd*htype] \{\
  658. \\$2\\$3
  659. .    br
  660. .\}
  661. .el \\$2\\$3\\*[hd*suf-space]\&\c
  662. .ft 1
  663. .S P P
  664. .\"
  665. .\" table of contents
  666. .if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ \{\
  667. .    ie \\n[Sectp] \{\
  668. .        toc@save \\n[hd*level] "\\*[hd*toc-mark]" "\\$2" \\*[hd*sect-pg]
  669. .    \}
  670. .    el .toc@save \\n[hd*level] "\\*[hd*toc-mark]" "\\$2" \\n[%]
  671. .\}
  672. .\"    set adjust to previous value
  673. .SA
  674. .\"    do break or space
  675. .if \\n[hd*htype] .br
  676. .if \\n[hd*htype]>1 .SP \\n[Lsp]u
  677. .if \\n[hd*htype] \{\
  678. .    \"    indent if Hi=1 and Pt=1
  679. .    if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
  680. .    \"    indent size of mark if Hi=2
  681. .    if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
  682. .\}
  683. .nr par@ind-flag 0            \" no indent on .P if Pt=2
  684. .\"
  685. .\"    check if it is time to reset footnotes
  686. .if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
  687. .\"
  688. .\"    check if it is time to reset indexes
  689. .if (\\n[hd*level]=1)&\\n[Sectf] \{\
  690. .    nr lix*fg-nr 0 1
  691. .    nr lix*tb-nr 0 1
  692. .    nr lix*ec-nr 0 1
  693. .    nr lix*ex-nr 0 1
  694. .\}
  695. .\"---------- user macro HZ ----------
  696. .if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
  697. .nr hd*last-pos \\n[nl]
  698. .nr hd*last-hpos \\n[.k]
  699. .nr par@ind-flag 0
  700. ..
  701. .\"--------
  702. .de HM
  703. .nr hd*i 0 1
  704. .while \\n+[hd*i]<8 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
  705. ..
  706. .\"----------------------
  707. .\" set page-nr, called from header 
  708. .\" 
  709. .de hd@set-page
  710. .if !r hd*h1-page .nr hd*h1-page \\n[%]
  711. .\"
  712. .ie \\n[Sectp] .nr P \\n[%]-\\n[hd*h1-page]+1
  713. .el .nr P \\n[%]
  714. .\"
  715. .\" Set section-page-string
  716. .ds hd*sect-pg \\n[H1]-\\n[P]
  717. ..
  718. .\"########### module pg ####################
  719. .\" set end of text trap
  720. .wh 0 pg@header
  721. .em pg@end-of-text
  722. .\"
  723. .ie \n[N]=4 .ds pg*header ''''
  724. .el .ds pg*header ''- % -''
  725. .ds pg*even-footer
  726. .ds pg*odd-footer
  727. .ds pg*even-header
  728. .ds pg*odd-header
  729. .ds pg*footer
  730. .\"
  731. .nr pg*top-margin 0
  732. .nr pg*foot-margin 0
  733. .nr pg*block-size 0
  734. .nr pg*footer-size 5\"             1v+footer+even/odd footer+2v
  735. .nr pg*header-size 7\"             3v+header+even/odd header+2v
  736. .nr pg*extra-footer-size 0
  737. .nr pg*extra-header-size 0
  738. .nr ft*note-size 0
  739. .nr pg*cur-column 0
  740. .nr pg*cols-per-page 1
  741. .nr pg*cur-po \n[@po]
  742. .nr pg*head-mark 0
  743. .\"
  744. .nr pg*ps \n[@ps]
  745. .nr pg*vs \n[@vs]
  746. .\"-------------------------
  747. .\" footer traps: set, enable and disable
  748. .de pg@set-new-trap
  749. .nr pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v+\\n[pg*extra-footer-size]u)
  750. .if \\n[D]>2 .tm pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v) = \\n[pg*foot-trap]
  751. .\" last-pos points to the position of the footer and bottom 
  752. .\" block below foot-notes.
  753. .nr pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v)
  754. ..
  755. .de pg@enable-trap
  756. .wh \\n[pg*foot-trap]u pg@footer
  757. .if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
  758. ..
  759. .de pg@disable-trap
  760. .ch pg@footer
  761. ..
  762. .\" move to new trap (if changed).
  763. .de pg@move-trap
  764. .pg@disable-trap
  765. .pg@set-new-trap
  766. .pg@enable-trap
  767. ..
  768. .de pg@enable-top-trap
  769. .\" set trap for pageheader.
  770. .nr pg*top-enabled 1
  771. ..
  772. .de pg@disable-top-trap
  773. .\" remove trap for pageheader.
  774. .nr pg*top-enabled 0
  775. ..
  776. .\" no header on the next page
  777. .de PGNH
  778. .nr pg*top-enabled -1
  779. ..
  780. .\" set first trap for pagefooter
  781. .pg@enable-top-trap
  782. .pg@set-new-trap
  783. .pg@enable-trap
  784. .\"-------------------------
  785. .\" stop output and begin on next page. Fix footnotes and all that.
  786. .de pg@next-page
  787. .\".debug next-page
  788. .ne 999i        \" activate trap
  789. .\" .pg@footer
  790. ..
  791. .\"-------------------------
  792. .\" support for PX and TP
  793. .als }t pg*header
  794. .als }e pg*even-header
  795. .als }o pg*odd-header
  796. .\"------------------------------------------------------------
  797. .\" HEADER
  798. .de pg@header
  799. .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
  800. .if \\n[Idxf] \{\
  801. .tl '<pagenr\ \\n[%]>'''
  802. .\}
  803. .\" assign current page-number to P
  804. .hd@set-page
  805. .\"
  806. .\" suppress pageheader if pagenumber == 1 and N == [124]
  807. .if \\n[pg*top-enabled] \{\
  808. .    if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u
  809. .    if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u
  810. .    ev pg*tl-ev
  811. .    pg@set-env
  812. .    ie !d TP \{\
  813. '        sp 3
  814. .        lt \\n[@ll]u
  815. .        ie ((\\n[%]=1)&(\\n[N]=1):(\\n[N]=2)) .sp
  816. .        el .tl \\*[pg*header]
  817. .        ie o .tl \\*[pg*odd-header]
  818. .        el .tl \\*[pg*even-header]
  819. '        sp 2
  820. .    \}
  821. .    el .TP
  822. .    ev
  823. .    \" why no-space??
  824. .    if d PX \{\
  825. .        ns
  826. .        PX
  827. .        rs
  828. .    \}
  829. .    \" check for pending footnotes 
  830. .    ft@check-old
  831. .    \"
  832. .    \" back to normal text processing
  833. .    \" .pg@enable-trap
  834. .    \" mark for multicolumn
  835. .    nr pg*head-mark \\n[nl]u
  836. .    \" set multicolumn
  837. .    \" 
  838. .    pg@set-po
  839. .    \" print floating displays
  840. .    ds@print-float 4
  841. .    tbl@top-hook
  842. .    ns
  843. .\}
  844. .if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
  845. .nr hd*cur-bline \\n[nl]    \" .H needs to know if output has occured
  846. ..
  847. .\"---------------------------------------------------------
  848. .\" FOOTER
  849. .de pg@footer
  850. .ec
  851. .pg@disable-trap
  852. .\".debug footer
  853. .tbl@bottom-hook
  854. .\" increment pageoffset for MC
  855. .\" move to the exact start of footer.
  856. 'sp |\\n[pg*foot-trap]u+1v
  857. .\"
  858. .if \\n[D]>3 .tm FOOTER after .sp
  859. .\" print footnotes
  860. .if d ft*div .ft@print
  861. .\"
  862. .pg@inc-po
  863. .if !\\n[pg*cur-column] .pg@print-footer
  864. .\" next column
  865. .pg@set-po
  866. .pg@enable-trap
  867. .if \\n[@verbose-flag] .eo        \" to help VERBON/VERBOFF
  868. ..
  869. .\"-------------------------
  870. .de pg@print-footer
  871. .\" jump to the position just below the foot-notes.
  872. 'sp |\\n[pg*last-pos]u+1v
  873. .\" check if there are any bottom block
  874. .if d pg*block-div .pg@block
  875. .\"
  876. .\" print the footer and eject new page
  877. .ev pg*tl-ev
  878. .pg@set-env
  879. .lt \\n[@ll]u
  880. .ie o .tl \\*[pg*odd-footer]
  881. .el .tl \\*[pg*even-footer]
  882. .ie (\\n[%]=1)&(\\n[N]=1) .tl \\*[pg*header]
  883. .el .tl \\*[pg*footer]
  884. .ev
  885. .ie (\\n[ds*fnr]>=\\n[ds*o-fnr]):\\n[ft*exist] \{\
  886. .    ev ne
  887. '    bp
  888. .    ev
  889. .\}
  890. .el 'bp
  891. ..
  892. .\"-------------------------
  893. .\"
  894. .\" Initialize the title environment
  895. .de pg@set-env
  896. 'na
  897. 'nh
  898. 'in 0
  899. 'ti 0
  900. 'ps \\n[pg*ps]
  901. 'vs \\n[pg*vs]
  902. ..
  903. .\"-------------------------
  904. .de PH
  905. .ds pg*header "\\$1
  906. .pg@set-new-size
  907. ..
  908. .de PF
  909. .ds pg*footer "\\$1
  910. .pg@set-new-size
  911. ..
  912. .de OH
  913. .ds pg*odd-header "\\$1
  914. .pg@set-new-size
  915. ..
  916. .de EH
  917. .ds pg*even-header "\\$1
  918. .pg@set-new-size
  919. ..
  920. .de OF
  921. .ds pg*odd-footer "\\$1
  922. .pg@set-new-size
  923. ..
  924. .de EF
  925. .ds pg*even-footer "\\$1
  926. .pg@set-new-size
  927. ..
  928. .de pg@clear-hd
  929. .ds pg*even-header
  930. .ds pg*odd-header
  931. .ds pg*header
  932. ..
  933. .de pg@clear-ft
  934. .ds pg*even-footer
  935. .ds pg*odd-footer
  936. .ds pg*footer
  937. ..
  938. .de pg@set-new-size
  939. .nr pg*ps \\n[@ps]
  940. .nr pg*vs \\n[@vs]
  941. .pg@move-trap
  942. ..
  943. .\"-------------------------
  944. .\" end of page processing
  945. .de pg@footnotes
  946. .\".debug footnotes
  947. .\" output footnotes. set trap for block
  948. .\"
  949. ..
  950. .\"-------------------------
  951. .\" print bottom block
  952. .de pg@block
  953. .ev pg*block-ev
  954. 'nf
  955. 'in 0
  956. .ll 100i
  957. .pg*block-div
  958. .br
  959. .ev
  960. ..
  961. .\"-------------------------
  962. .\" define bottom block
  963. .de BS
  964. .misc@ev-keep pg*block-ev
  965. .init@reset
  966. .br
  967. .di pg*block-div
  968. ..
  969. .\"-------------------------
  970. .de BE
  971. .br
  972. .di
  973. .nr pg*block-size \\n[dn]u
  974. .ev
  975. .pg@move-trap
  976. ..
  977. .\"-------------------------
  978. .\" print out all pending text
  979. .de pg@end-of-text
  980. .\" non-empty environment
  981. .misc@ev-keep ne
  982. .init@reset
  983. \c
  984. .ds@print-float 3
  985. .ev
  986. .if d ref*div .RP
  987. ..
  988. .\"-------------------------
  989. .\" set top and bottom margins 
  990. .de VM
  991. .if \\n[.$]=0 \{\
  992. .    nr pg*extra-footer-size 0
  993. .    nr pg*extra-header-size 0
  994. .\}
  995. .if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1)
  996. .if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2)
  997. .if \\n[D]>2 \{\
  998. .    tm extra top \\n[pg*extra-footer-size]
  999. .    tm extra bottom \\n[pg*extra-header-size]
  1000. .\}
  1001. .pg@move-trap
  1002. ..
  1003. .\"---------------------
  1004. .\" multicolumn output. 
  1005. .de pg@set-po
  1006. .if \\n[pg*cols-per-page]>1 \{\
  1007. .    ll \\n[pg*column-size]u
  1008. .\}
  1009. ..
  1010. .de pg@inc-po
  1011. .if \\n[pg*cols-per-page]>1 \{\
  1012. .    ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
  1013. .        nr pg*cur-column 0 1
  1014. .        nr pg*cur-po \\n[@po]u
  1015. .        po \\n[@po]u
  1016. .        ll \\n[@ll]u
  1017. .    \}
  1018. .    el \{\
  1019. .        nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
  1020. .        po \\n[pg*cur-po]u
  1021. '        sp |\\n[pg*head-mark]u
  1022. .        tbl@top-hook
  1023. .    \}
  1024. .\}
  1025. ..
  1026. .de 1C
  1027. .br
  1028. .if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
  1029. .nr pg*cols-per-page 1
  1030. .nr pg*column-sep 0
  1031. .nr pg*column-size \\n[@ll]
  1032. .nr pg*cur-column 0 1
  1033. .nr pg*cur-po \\n[@po]u
  1034. .PGFORM
  1035. .\".pg@next-page
  1036. .SK
  1037. ..
  1038. .de 2C
  1039. .br
  1040. .nr pg*head-mark \\n[nl]u
  1041. .if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
  1042. .nr pg*cols-per-page 2
  1043. .nr pg*column-sep \\n[@ll]/15
  1044. .nr pg*column-size (\\n[@ll]u*7)/15
  1045. .nr pg*cur-column 0 1
  1046. .nr pg*cur-po \\n[@po]u
  1047. .ll \\n[pg*column-size]u
  1048. .lt \\n[pg*column-size]u
  1049. ..
  1050. .\" MC column-size [ column-separation ]
  1051. .de MC
  1052. .br
  1053. .nr pg*head-mark \\n[nl]u
  1054. .if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
  1055. .ie ''\\$1' .nr pg*column-size \\n[.l]
  1056. .el .nr pg*column-size (n;\\$1)
  1057. .ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
  1058. .el .nr pg*column-sep (n;\\$2)
  1059. .\"
  1060. .nr pg*cols-per-page (u;\\n[.l]/(\\n[pg*column-size]+\\n[pg*column-sep]+1))
  1061. .nr pg*cur-column 0 1
  1062. .nr pg*cur-po \\n[@po]u
  1063. .ll \\n[pg*column-size]u
  1064. .lt \\n[pg*column-size]u
  1065. ..
  1066. .\" begin a new column
  1067. .de NCOL
  1068. .br
  1069. .pg@footer
  1070. ..
  1071. .\" skip pages
  1072. .de SK
  1073. .br
  1074. .bp
  1075. .nr pg*i 0 1
  1076. .while \\n+[pg*i]<=(0\\$1) .bp
  1077. ..
  1078. .\"-------------------------------
  1079. .\" MULB width1 space1 width2 space2 width3 space3 ...
  1080. .de MULB
  1081. .br
  1082. .nr pg*i 0 1
  1083. .nr pg*mul-x 0 1
  1084. .nr pg*mul-ind 0
  1085. .nr pg*mul-last 0
  1086. .while \\n[.$] \{\
  1087. .    nr pg*mul!\\n+[pg*i] (n;0\\$1)
  1088. .    nr pg*muls!\\n[pg*i] (n;0\\$2)
  1089. .    shift 2
  1090. .\}
  1091. .nr pg*mul-max-col \\n[pg*i]
  1092. .ev pg*mul-ev
  1093. .fi
  1094. .hy 14
  1095. .di pg*mul-div
  1096. .MULN
  1097. ..
  1098. .\"-----------
  1099. .de MULN
  1100. .if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth"
  1101. .br
  1102. .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
  1103. .rt +0
  1104. .in \\n[pg*mul-ind]u
  1105. .ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u
  1106. .nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]])
  1107. ..
  1108. .\"-----------
  1109. .\" MULE
  1110. .de MULE
  1111. .br
  1112. .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
  1113. .di
  1114. .ev
  1115. .ne \\n[pg*mul-last]u
  1116. .nf
  1117. .mk
  1118. .pg*mul-div
  1119. .rt
  1120. .sp \\n[pg*mul-last]u
  1121. .fi
  1122. ..
  1123. .\"-----------
  1124. .de OP
  1125. .br
  1126. .ie o .if !\\n[pg*head-mark]=\\n[nl] \{\
  1127. .    bp +1
  1128. .    bp +1
  1129. .\}
  1130. .el .bp
  1131. ..
  1132. .\"########### module footnotes ###################
  1133. .nr ft*note-size 0
  1134. .nr ft*busy 0
  1135. .nr ft*nr 0 1
  1136. .nr ft*wide 0
  1137. .nr ft*hyphen 0\"    hyphenation value
  1138. .nr ft*adjust 1\"    >0 if adjust true
  1139. .nr ft*indent 1\"    >0 if text indent true (not imp. $$$)
  1140. .nr ft*just 0\"    0=left justification, 1=right (not imp. $$$)
  1141. .nr ft*exist 0\"    not zero if there are any footnotes to be printed
  1142. .nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
  1143. .\"
  1144. .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
  1145. .\"
  1146. .\"-----------------
  1147. .\" init footnote environment
  1148. .de ft@init
  1149. .\" indentcontrol not implemented $$$
  1150. .\" label justification not implemented $$$
  1151. 'in 0
  1152. 'fi
  1153. .ie \\n[ft*adjust] 'ad
  1154. .el 'na
  1155. .ie \\n[ft*hyphen] 'hy 14
  1156. .el 'hy 0
  1157. .ll \\n[@cur-ll]u
  1158. .lt \\n[@cur-ll]u
  1159. .ps (\\n[@ps]-2)
  1160. .vs (\\n[@vs]-1)
  1161. ..
  1162. .\"-----------------
  1163. .\" set footnote format
  1164. .\" no support for two column processing (yet). $$$
  1165. .de FD
  1166. .if \\n[.$]=0 .@error "FD: bad arg \\$1"
  1167. .ie \\n[.$]=2 .nr ft*clear-at-header 1
  1168. .el .nr ft*clear-at-header 0
  1169. .\"
  1170. .if !'\\$1'' \{\
  1171. .    ie \\$1>11 .nr ft*format 0
  1172. .    el .nr ft*format \\$1
  1173. .    \"
  1174. .    nr ft*hyphen (\\n[ft*format]%2)*14
  1175. .    nr ft*format \\n[ft*format]/2
  1176. .    \"
  1177. .    nr ft*adjust 1-(\\n[ft*format]%2)
  1178. .    nr ft*format \\n[ft*format]/2
  1179. .    \"
  1180. .    nr ft*indent 1-(\\n[ft*format]%2)
  1181. .    nr ft*format \\n[ft*format]/2
  1182. .    \"
  1183. .    nr ft*just \\n[ft*format]%2
  1184. .\}
  1185. ..
  1186. .\"---------------
  1187. .\" Footnote and display width control $$$
  1188. .de WC
  1189. .nr ft*i 0 1
  1190. .while \\n+[ft*i]<=\\n[.$] \{\
  1191. .    ds ft*x \\$[\\n[ft*i]]
  1192. .    if '\\*[ft*x]'N' \{\
  1193. .        nr ft*wide 0
  1194. .        nr ft*first-fn 0
  1195. .        nr ds*wide 0
  1196. .        nr ds*float-break 1
  1197. .    \}
  1198. .    if '\\*[ft*x]'-WF' .nr ft*wide 0
  1199. .    if '\\*[ft*x]'WF' .nr ft*wide 1
  1200. .    if '\\*[ft*x]'-FF' .nr ft*first-fn 0
  1201. .    if '\\*[ft*x]'FF' .nr ft*first-fn 1
  1202. .    if '\\*[ft*x]'-WD' .nr ds*wide 0
  1203. .    if '\\*[ft*x]'WD' .nr ds*wide 1
  1204. .    if '\\*[ft*x]'-FB' .nr ds*float-break 0
  1205. .    if '\\*[ft*x]'FB' .nr ds*float-break 1
  1206. .\}
  1207. ..
  1208. .\"-----------------
  1209. .\" begin footnote
  1210. .de FS
  1211. .if \\n[ft*busy] .@error "FS: missing FE"
  1212. .nr ft*busy 1
  1213. .ev ft*ev
  1214. .ft@init
  1215. .if !\\n[ft*wide] .pg@set-po
  1216. .if !d ft*div .ft@init-footnote
  1217. .di ft*tmp-div
  1218. .nr ft*space (u;\\n[Fs]*\\n[Lsp])
  1219. .sp \\n[ft*space]u
  1220. .\" print mark
  1221. .ie \\n[.$] .ds ft*mark \\$1
  1222. .el .ds ft*mark \\n[ft*nr].
  1223. \\*[ft*mark]
  1224. .in +.75c
  1225. .sp -1
  1226. .nr ft*exist 1
  1227. ..
  1228. .\"-----------------
  1229. .\" init footnote diversion
  1230. .de ft@init-footnote
  1231. .di ft*div
  1232. \l'20n'
  1233. .br
  1234. .di
  1235. .nr ft*note-size \\n[dn]
  1236. ..
  1237. .\"-----------------
  1238. .\" end footnote
  1239. .de FE
  1240. .nr ft*busy 0
  1241. .br
  1242. .di
  1243. 'in 0
  1244. 'nf
  1245. .if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
  1246. .ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
  1247. .    da ft*next-div
  1248. .    ft*tmp-div
  1249. .    br
  1250. .    di
  1251. .\}
  1252. .el \{\
  1253. .    da ft*div
  1254. .    ft*tmp-div
  1255. .    di
  1256. .    nr ft*note-size +\\n[dn]
  1257. .\}
  1258. .rm ft*tmp-div
  1259. .ev
  1260. .pg@move-trap
  1261. ..
  1262. .\"-----------------
  1263. .\" print footnotes, see pg@footer
  1264. .de ft@print
  1265. .ev ft*print-ev
  1266. 'nf
  1267. 'in 0
  1268. .ll 100i
  1269. .ft*div
  1270. .br
  1271. .ev
  1272. .rm ft*div
  1273. .nr ft*note-size 0
  1274. .pg@move-trap
  1275. ..
  1276. .\"-----------------
  1277. .\" check if any pending footnotes, see pg@header
  1278. .de ft@check-old
  1279. .if d ft*next-div \{\
  1280. .    ev ft*ev
  1281. .    ft@init
  1282. .    ft@init-footnote
  1283. .    nf
  1284. .    in 0
  1285. .    da ft*div
  1286. .    ft*next-div
  1287. .    di
  1288. .    nr ft*note-size +\\n[dn]
  1289. .    rm ft*next-div
  1290. .    ev
  1291. .    nr ft*exist 0
  1292. .    pg@move-trap
  1293. .\}
  1294. ..
  1295. .\"########### module display ###################
  1296. .nr ds*wide 0\"        >0 if wide displays wanted
  1297. .nr ds*fnr 0 1\"    floating display counter
  1298. .nr ds*o-fnr 1\"    floating display counter, already printed
  1299. .nr ds*snr 0 1\"    static display counter
  1300. .nr ds*lvl 0 1\"    display level
  1301. .nr ds*float-busy 0\"    >0 if printing float
  1302. .nr ds*ffloat 0\"    >0 if DF, 0 if DS
  1303. .\" static display start
  1304. .\" nested DS/DE is allowed. No limit on depth.
  1305. .de DS
  1306. .br
  1307. .ds@start 0 DS \\$@
  1308. ..
  1309. .\" floating display start
  1310. .\" nested DF/DE is not allowed.
  1311. .de DF
  1312. .if \\n[ds*lvl] .@error "DF:nested floating is not allowed. Use DS."
  1313. .ds@start 1 DF \\$@
  1314. ..
  1315. .\"---------------
  1316. .nr ds*format 0\"    dummy value for .En/.EQ
  1317. .nr ds*format! 0\"    no indent
  1318. .nr ds*format!0 0\"    no indent
  1319. .nr ds*format!L 0\"    no indent
  1320. .nr ds*format!I 1\"    indent
  1321. .nr ds*format!1 1\"    indent
  1322. .nr ds*format!C 2\"    center each line
  1323. .nr ds*format!2 2\"    center each line
  1324. .nr ds*format!CB 3\"    center as block
  1325. .nr ds*format!3 3\"    center as block
  1326. .nr ds*format!R 4\"    right justify each line
  1327. .nr ds*format!4 4\"    right justify each line
  1328. .nr ds*format!RB 5\"    right justify as block
  1329. .nr ds*format!5 5\"    right justify as block
  1330. .\"---------------
  1331. .nr ds*fill! 0\"    no fill
  1332. .nr ds*fill!N 0\"    no fill
  1333. .nr ds*fill!0 0\"    no fill
  1334. .nr ds*fill!F 1\"    fill on
  1335. .nr ds*fill!1 1\"    fill on
  1336. .\"---------------
  1337. .de ds@start
  1338. .nr ds*ffloat \\$1
  1339. .ds ds*type \\$2
  1340. .shift 2
  1341. .nr ds*lvl +1
  1342. .\" get format of the display
  1343. .ie \\n[.$] \{\
  1344. .    ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
  1345. .    el .@error "\\*[ds*type]:wrong format:\\$1"
  1346. .\}
  1347. .el .nr ds*format 0
  1348. .\" fill or not to fill, that is the...
  1349. .nr ds*fill 0
  1350. .ie \\n[.$]>1 \{\
  1351. .    ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
  1352. .    el .@error "\\*[ds*type]:wrong fill:\\$2"
  1353. .\}
  1354. .nr ds*rindent 0
  1355. .if \\n[.$]>2 .nr ds*rindent \\$3
  1356. .\"
  1357. .\"
  1358. .nr ds*old-ll \\n[.l]
  1359. .misc@push ds-ll \\n[.l]
  1360. .misc@push ds-form \\n[ds*format]
  1361. .misc@push ds-ffloat \\n[ds*ffloat]
  1362. .nr ds*i \\n[.i]
  1363. .nr ds*ftmp \\n[.f]
  1364. .misc@ev-keep ds*ev!\\n+[ds*snr]
  1365. .ft \\n[ds*ftmp]
  1366. .\"
  1367. .init@reset
  1368. 'in \\n[ds*i]u
  1369. .di ds*div!\\n[ds*snr]
  1370. .\"
  1371. .ll \\n[ds*old-ll]u
  1372. .lt \\n[ds*old-ll]u
  1373. .if \\n[ds*rindent] \{\
  1374. .    ll -\\n[ds*rindent]n
  1375. .    lt -\\n[ds*rindent]n
  1376. .\}
  1377. .if \\n[ds*wide] \{\
  1378. .    ll \\n[@ll]u
  1379. .    lt \\n[@ll]u
  1380. .\}
  1381. .\"
  1382. .ie \\n[ds*fill] 'fi
  1383. .el 'nf
  1384. .\"
  1385. .if \\n[ds*format]=1 \{\
  1386. .    ll -\\n[Si]n
  1387. .    lt -\\n[Si]n
  1388. '    in +\\n[Si]n
  1389. .\}
  1390. .if (\\n[ds*format]=3):(\\n[ds*format]=5) 'in 0
  1391. ..
  1392. .\"---------------
  1393. .de DE
  1394. .if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS or DF"
  1395. .br
  1396. .if \\n[ds*ffloat] .SP \\n[Lsp]u
  1397. .di
  1398. .nr ds*width \\n[dl]
  1399. .nr ds*height \\n[dn]
  1400. .misc@pop-nr ds-ll ds*old-ll
  1401. .misc@pop-nr ds-form ds*format
  1402. .misc@pop-nr ds-ffloat ds*ffloat
  1403. .if (\\n[ds*format]>=2)&(\\n[ds*width]>\\n[ds*old-ll]) \{\
  1404. .    @error "DE: display too wide for current line-length"
  1405. .\}
  1406. .\" prepare copy to floating display
  1407. .if \\n[ds*ffloat] .di ds*fdiv!\\n+[ds*fnr]
  1408. .\"
  1409. 'in 0
  1410. 'nf
  1411. .if \\n[ds*format]=2 'ce 9999
  1412. .if \\n[ds*format]=3 'in (u;(\\n[ds*old-ll]-\\n[ds*width])/2)
  1413. .if \\n[ds*format]=4 'rj 9999
  1414. .if \\n[ds*format]=5 'in (u;\\n[ds*old-ll]-\\n[ds*width])
  1415. .\"
  1416. .ie !\\n[ds*ffloat] \{\
  1417. .    \"
  1418. .    \"    Print static display
  1419. .    \"    Eject page if display will fit one page and
  1420. .    \"    there are less than half of the page left.
  1421. .    nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]v-\\n[pg*extra-header-size]v
  1422. .    if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) \{\
  1423. .        ne \\n[.t]u+1v
  1424. .    \}
  1425. .    if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) \{\
  1426. .        ne \\n[.t]u+1v
  1427. .    \}
  1428. .    if \\n[Ds] .SP \\n[Lsp]u
  1429. .\}
  1430. .el .SP \\n[Lsp]u
  1431. .ds*div!\\n[ds*snr]
  1432. .ie !\\n[ds*ffloat] .if \\n[Ds] .SP \\n[Lsp]u
  1433. .el \{\
  1434. .    SP \\n[Lsp]u
  1435. .    di
  1436. .\}
  1437. .if \\n[ds*format]=2 'ce 0
  1438. .if \\n[ds*format]=4 'rj 0
  1439. .rm ds*div!\\n[ds*snr]
  1440. .nr ds*snr -1
  1441. .nr par@ind-flag 0
  1442. .\"        move div to the floating display list
  1443. .ev
  1444. .if \\n[ds*ffloat] \{\
  1445. .    nr ds*fsize!\\n[ds*fnr] \\n[dn]
  1446. .    \" print float if queue is empty and the display fits into
  1447. .    \" the current page
  1448. .    if (\\n[ds*fnr]>\\n[ds*o-fnr])&(\\n[ds*height]<\\n[.t]) \{\
  1449. .        ds@print-float 1
  1450. .    \}
  1451. .\}
  1452. ..
  1453. .\"---------------
  1454. .\" print according to Df and De.
  1455. .\" .ds@print-float type
  1456. .\"    type    called from
  1457. .\"    1    .DE
  1458. .\"    2    end of section
  1459. .\"    3    end of document
  1460. .\"    4    beginning of new page
  1461. .\"
  1462. .de ds@print-float
  1463. .if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
  1464. .if !\\n[ds*float-busy] \{\
  1465. .    nr ds*float-busy 1
  1466. .\" at .DE
  1467. .    if (\\$1=1)&((\\n[Df]%2)=1) \{\
  1468. .        if \\n[.t]>\\n[ds*fsize!\\n[ds*fnr]] \{\
  1469. .            \" Df = 1,3 or 5
  1470. .            ds@print-one-float
  1471. .        \}
  1472. .    \}
  1473. .\" print all if Df<2 and end of section
  1474. .    if (\\$1=2)&(\\n[Df]<2) .ds@print-all-floats
  1475. .\" print all if end of document. Where should they go instead?
  1476. .    if \\$1=3 .ds@print-all-floats
  1477. .\" new page
  1478. .    if (\\$1=4)&(\\n[Df]>1) \{\
  1479. .        if \\n[Df]=2 .ds@print-one-float
  1480. .        if \\n[Df]=3 .ds@print-one-float
  1481. .        if \\n[Df]>3 \{\
  1482. .            ie \\n[De] .ds@print-all-floats
  1483. .            el .ds@print-this-page
  1484. .        \}
  1485. .    \}
  1486. .    nr ds*float-busy 0
  1487. .\}
  1488. ..
  1489. .\"---------------
  1490. .\" print a floating diversion
  1491. .de ds@output-div
  1492. .ev ds*fev
  1493. .in 0
  1494. .nf
  1495. .ds*fdiv!\\n[ds*o-fnr]
  1496. .ev
  1497. .rm ds*fdiv!\\n[ds*o-fnr]
  1498. .rm ds*fsize!\\n[ds*o-fnr]
  1499. .rm ds*fformat!\\n[ds*o-fnr]
  1500. .nr ds*o-fnr +1
  1501. ..
  1502. .\"---------------
  1503. .\" print one floating display if there is one.
  1504. .de ds@print-one-float
  1505. .if \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
  1506. .    if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .pg@next-page
  1507. .    ds@output-div
  1508. .    if \\n[De] .pg@next-page
  1509. .\}
  1510. ..
  1511. .\"---------------
  1512. .\" print all queued floats.
  1513. .\" if De>0 do a page eject between the floats.
  1514. .de ds@print-all-floats
  1515. .while \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
  1516. .    if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .pg@next-page
  1517. .    ds@output-div
  1518. .    if \\n[De] .pg@next-page
  1519. .\}
  1520. ..
  1521. .\"---------------
  1522. .\" print as many floats as will fit on the current page
  1523. .de ds@print-this-page
  1524. .while \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
  1525. .    if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .break
  1526. .    ds@output-div
  1527. .\}
  1528. ..
  1529. .\"########### module list ###################
  1530. .\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
  1531. .\"
  1532. .nr li*tind 0
  1533. .nr li*mind 0
  1534. .nr li*pad 0
  1535. .nr li*type 0
  1536. .ds li*mark 0
  1537. .nr li*li-spc 0
  1538. .nr li*lvl 0 1
  1539. .nr li*cur-vpos 0
  1540. .\"--------------------------
  1541. .\"    the major list-begin macro.
  1542. .\"    If type == -1 a 'break' will occur.
  1543. .de LB
  1544. .if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
  1545. .misc@push cind \\n[.i]
  1546. .misc@push tind \\n[li*tind]
  1547. .misc@push mind \\n[li*mind]
  1548. .misc@push pad \\n[li*pad]
  1549. .misc@push type \\n[li*type]
  1550. .misc@push li-spc \\n[li*li-spc]
  1551. .ds li*mark-list!\\n[li*lvl] \\*[li*mark]
  1552. .nr li*lvl +1
  1553. .\"
  1554. .nr li*tind (n;0\\$1)\"            text-indent
  1555. .nr li*mind (n;0\\$2)\"            mark-indent
  1556. .nr li*pad (n;0\\$3)\"            pad
  1557. .nr li*type 0\\$4\"            type
  1558. .ds li*mark \\$5\"            mark
  1559. .ie !'\\$6'' .nr li*li-spc \\$6\"    LI-space
  1560. .el .nr li*li-spc 1
  1561. .ie !'\\$7'' .nr li*lb-spc \\$6\"    LB-space
  1562. .el .nr li*lb-spc 0
  1563. .\" init listcounter
  1564. .nr li*cnt!\\n[li*lvl] 0 1
  1565. .\" assign format
  1566. .af li*cnt!\\n[li*lvl] 1
  1567. .if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
  1568. .\"
  1569. .if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp])
  1570. .in +\\n[li*tind]u
  1571. ..
  1572. .\"---------------
  1573. .de LI
  1574. .if \\n[li*lvl]<1 .@error "LI:no lists active"
  1575. .if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp])
  1576. .ne 2v
  1577. .\"
  1578. .ds li*c-mark \\*[li*mark]
  1579. .nr li*cnt!\\n[li*lvl] +1
  1580. .if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
  1581. .if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
  1582. .if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
  1583. .if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
  1584. .if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
  1585. .if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
  1586. .if \\n[.$]=1 .ds li*c-mark \\$1
  1587. .if \\n[.$]=2 .ds li*c-mark \\$1\ \\*[li*c-mark]
  1588. .if '\\*[li*c-mark]'\ ' .ds li*c-mark
  1589. .\"
  1590. .\" determine where the text begins
  1591. .nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @
  1592. .\"
  1593. .\" determine where the mark begin
  1594. .ie !\\n[li*pad] .nr li*in \\n[li*mind]
  1595. .el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@
  1596. .if !\\n[li*in] .nr li*in 0
  1597. .\"
  1598. .ti -\\n[li*tind]u
  1599. .\" no indentation if hanging indent
  1600. .if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0
  1601. \Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
  1602. .if \\n[li*type]=-1 .br
  1603. ..
  1604. .\"
  1605. .\"-------------
  1606. .de li@pop
  1607. .nr li*lvl -1
  1608. .misc@pop-nr cind li*tmp
  1609. .in \\n[li*tmp]u
  1610. .misc@pop-nr tind li*tind
  1611. .misc@pop-nr mind li*mind
  1612. .misc@pop-nr pad li*pad
  1613. .misc@pop-nr type li*type
  1614. .misc@pop-nr li-spc li*li-spc
  1615. .ds li*mark \\*[li*mark-list!\\n[li*lvl]]
  1616. ..
  1617. .de LE
  1618. .if \\n[li*lvl]<1 .@error "LE:mismatched"
  1619. .li@pop
  1620. .if '\\$1'1' .SP \\n[Lsp]u
  1621. ..
  1622. .\"-------------
  1623. .\"    list status clear.
  1624. .de LC
  1625. .if !\\n[.$]=1 .@error "LC: no argument"
  1626. .if \\$1>\\n[li*lvl] .@error "LC: incorrect argument: \\$1 (too big)"
  1627. .while \\n[li*lvl]>\\$1 .li@pop
  1628. .nr par@ind-flag 0
  1629. ..
  1630. .\"-------------
  1631. .de AL
  1632. .if \\n[.$]>3 .@error "AL: too many arguments"
  1633. .if \\n[D]>2 .tm AL $*
  1634. .ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
  1635. .el \{\
  1636. .    ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
  1637. .    el \{\
  1638. .        ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
  1639. .        el .LB \\n[Li] 0 2 1 "\\$1" 0 1
  1640. .    \}
  1641. .\}
  1642. ..
  1643. .de ML
  1644. .if \\n[.$]>3 .@error "ML: too many arguments"
  1645. .if \\n[D]>2 .tm ML $*
  1646. .nr li*ml-width \w@\\$1@u+1n
  1647. .if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
  1648. .if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
  1649. .if \\n[.$]=3 \{\
  1650. .    ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
  1651. .    el .LB \\n[Li] 0 1 0 "\\$1" 0 1
  1652. .\}
  1653. ..
  1654. .de VL
  1655. .if \\n[D]>2 .tm VL $*
  1656. .if \\n[.$]>3 .@error "VL: too many arguments"
  1657. .if \\n[.$]<1 .@error "VL: missing text-indent"
  1658. .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
  1659. .el .LB 0\\$1 0\\$2 0 0 \& 0 1
  1660. ..
  1661. .\"    Bullet (for .BL)
  1662. .de BL
  1663. .if \\n[D]>2 .tm BL $*
  1664. .ds BU \s-2\(bu\s0
  1665. .if \\n[.$]>2 .@error "BL: too many arguments"
  1666. .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
  1667. .if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
  1668. .if \\n[.$]=2 \{\
  1669. .    ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
  1670. .    el .LB 0\\$1 0 1 0 \\*[BU] 0 1
  1671. .\}
  1672. ..
  1673. .de DL
  1674. .if \\n[D]>2 .tm DL $*
  1675. .if \\n[.$]>2 .@error "DL: too many arguments"
  1676. .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
  1677. .if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
  1678. .if \\n[.$]=2 \{\
  1679. .    ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
  1680. .    el .LB 0\\$1 0 1 0 \(em 0 1
  1681. .\}
  1682. ..
  1683. .de RL
  1684. .if \\n[D]>2 .tm RL $*
  1685. .if \\n[.$]>2 .@error "RL: too many arguments"
  1686. .if \\n[.$]<1 .LB 6 0 2 4
  1687. .if \\n[.$]=1 .LB 0\\$1 0 2 4
  1688. .if \\n[.$]=2 \{\
  1689. .    ie '\\$1'' .LB 6 0 2 4 1 0 1
  1690. .    el .LB 0\\$1 0 2 4 1 0 1
  1691. .\}
  1692. ..
  1693. .\" Broken Variable List. As .VL but text begin on the next line
  1694. .de BVL
  1695. .if \\n[D]>2 .tm BVL $*
  1696. .if \\n[.$]>3 .@error "BVL: too many arguments"
  1697. .if \\n[.$]<1 .@error "BVL: missing text-indent"
  1698. .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
  1699. .el .LB 0\\$1 0\\$2 0 -1 \& 0 1
  1700. ..
  1701. .\" ####### module tbl #######################################
  1702. .\" This module is copied from groff_ms and modified for mgm.
  1703. .\" Yes, it does not resemble the original anymore :-).
  1704. .\" Don't know if I missed something important.
  1705. .\" Groff_ms is written by James Clark.
  1706. .nr tbl*have-header 0
  1707. .nr tbl*header-written 0
  1708. .de TS
  1709. .br
  1710. .if ''\\n[.z]' .SP
  1711. .if '\\$1'H' .di tbl*header-div
  1712. ..
  1713. .de tbl@top-hook
  1714. .if \\n[tbl*have-header] \{\
  1715. .    ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
  1716. .    el .sp \\n[.t]u
  1717. .\}
  1718. ..
  1719. .de tbl@bottom-hook
  1720. .if \\n[tbl*have-header] \{\
  1721. .    nr T. 1
  1722. .\" draw bottom and side lines of boxed tables.
  1723. .    T#
  1724. .\}
  1725. .nr tbl*header-written 0
  1726. ..
  1727. .de tbl@print-header
  1728. .ev tbl*ev
  1729. 'nf
  1730. .tbl*header-div
  1731. .ev
  1732. .mk #T
  1733. .nr tbl*header-written 1
  1734. ..
  1735. .de TH
  1736. .ie '\\n[.z]'tbl*header-div' \{\
  1737. .    nr T. 0
  1738. .    T#
  1739. .    br
  1740. .    di
  1741. .    nr tbl*header-ht \\n[dn]
  1742. .    ne \\n[dn]u+1v
  1743. .    nr tbl*have-header 1
  1744. .    ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
  1745. .    el .tbl@print-header
  1746. .\}
  1747. .el .@error ".TH without .TS H"
  1748. ..
  1749. .de TE
  1750. .ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
  1751. .el \{\
  1752. .    nr tbl*have-header 0
  1753. .\}
  1754. .\" reset tabs
  1755. .TAB
  1756. ..
  1757. .de T&
  1758. ..
  1759. .\" ####### module pic #######################################
  1760. .de PS
  1761. .nr pic*in 0
  1762. .br
  1763. .SP .5
  1764. .ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
  1765. .el \{\
  1766. .    if !\\n[ds*lvl] .ne (u;\\$1)+1v
  1767. .\" should be contained between .DS/.DE
  1768. .if r ds*format \{\
  1769. .        if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
  1770. .            nr pic*in \\n[.i]
  1771. .\" .        in +(u;\\n[.l]-\\n[.i]-\\$2/2)
  1772. .        \}
  1773. .    \}
  1774. .\}
  1775. ..
  1776. .de PE
  1777. .init@reset
  1778. .SP .5
  1779. ..
  1780. .\" ####### module eq #######################################
  1781. .\" 
  1782. .nr eq*number 0 1
  1783. .de EQ
  1784. .ds eq*lable "\\$1
  1785. .di eq*div
  1786. .misc@ev-keep eq*ev
  1787. .in 0
  1788. .nf
  1789. ..
  1790. .de EN
  1791. .br
  1792. .di
  1793. .ta
  1794. .\" equation with lable.
  1795. .if \\n[dl] \{\
  1796. .    br
  1797. .    chop eq*div
  1798. .    ie (\\n[Eq]%2) \{\
  1799. .        \"    lable to the left
  1800. .        if \\n[ds*format]<2 \{\
  1801. .            ta (u;(\\n[.l]/7)+\\n[.i]) \\n[.l]u\" L
  1802. \\*[eq*lable]\t\\*[eq*div]\t\&
  1803. .        \}
  1804. .        if (\\n[ds*format]=2):(\\n[ds*format]=3) \{\
  1805. .            ta (u;(\\n[.l]-\\n[.i])/2+\\n[.i])C \\n[.l]u\" C
  1806. \\*[eq*lable]\t\\*[eq*div]\t\&
  1807. .        \}
  1808. .        if \\n[ds*format]>3 \{\
  1809. .            ta \\n[.l]uR\"    R
  1810. \\*[eq*lable]\t\\*[eq*div]
  1811. .        \}
  1812. .    \}
  1813. .    el \{\
  1814. .        \"    lable to the right
  1815. .        if \\n[ds*format]<2 \{\
  1816. .            ta \\n[.l]uR\" L
  1817. \\*[eq*div]\t\\*[eq*lable]
  1818. .        \}
  1819. .        if (\\n[ds*format]=2):(\\n[ds*format]=3) \{\
  1820. .            ta (u;(\\n[.l]-\\n[.i])/2+\\n[.i])C \\n[.l]uR\" C
  1821. \t\\*[eq*div]\t\\*[eq*lable]
  1822. .        \}
  1823. .        if \\n[ds*format]>3 \{\
  1824. .            ta (\\n[.l]u-\w@\\*[eq*lable]@u-1m)R \\n[.l]uR\" R
  1825. \t\\*[eq*div]\t\\*[eq*lable]
  1826. .        \}
  1827. .    \}
  1828. .\}
  1829. .TAB
  1830. .ev
  1831. ..
  1832. .\"########### module toc ###################
  1833. .\" table of contents
  1834. .nr toc*slevel 1
  1835. .nr toc*spacing \n[Lsp]u
  1836. .nr toc*tlevel 2
  1837. .nr toc*tab 0
  1838. .\"-----------
  1839. .\" Table of contents with friends (module lix)
  1840. .de TC
  1841. .br
  1842. .\" print any pending displays
  1843. .pg@end-of-text
  1844. .if \w@\\$1@>0 .nr toc*slevel \\$1
  1845. .if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp])
  1846. .if \w@\\$3@>0 .nr toc*tlevel \\$3
  1847. .if \w@\\$4@>0 .nr toc*tab \\$4
  1848. .if \\n[pg*cols-per-page]>1 .1C
  1849. .pg@clear-hd
  1850. .pg@next-page
  1851. .pg@clear-ft
  1852. .\"-------------
  1853. .if d Ci .toc@read-Ci \\*[Ci]
  1854. .nf
  1855. .in 0
  1856. .nr toc*pn 0 1
  1857. .af toc*pn i
  1858. .PF "''\\\\\\\\n+[toc*pn]''"
  1859. .nr toc*i 4 1
  1860. .while \\n+[toc*i]<10 \{\
  1861. .    if !'\\$\\n[toc*i]'' \{\
  1862. .        ce
  1863. \\$\\n[toc*i]
  1864. .        br
  1865. .    \}
  1866. .\}
  1867. .if \\n[.$]<=4 .if d TX .TX
  1868. .ie d TY .if \\n[.$]<=4 .TY
  1869. .el \{\
  1870. .    ce
  1871. \\*[Licon]
  1872. .    br
  1873. .    SP 3
  1874. .\}
  1875. .toc*list
  1876. .\" print LIST OF XXX
  1877. .if d lix*dsfg .lix@print-ds fg "\\*[Lf]"
  1878. .if d lix*dstb .lix@print-ds tb "\\*[Lt]"
  1879. .if d lix*dsec .lix@print-ds ec "\\*[Le]"
  1880. .if d lix*dsex .lix@print-ds ex "\\*[Lx]"
  1881. ..
  1882. .\"-----------
  1883. .\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
  1884. .de toc@read-Ci
  1885. .nr toc*i 0 1
  1886. .while \\n+[toc*i]<8 \{\
  1887. .    nr toc*hl!\\n[toc*i] \\$\\n[toc*i]
  1888. .\}
  1889. ..
  1890. .\"-----------
  1891. .de toc@save
  1892. .\" collect maxsize of mark if string Ci don't exist.
  1893. .if !d Ci \{\
  1894. .    if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
  1895. .    if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\
  1896. .        nr toc*hl!\\$1 \w@\\$2@u+1m
  1897. .    \}
  1898. .\}
  1899. .am toc*list
  1900. .\" .toc@set level headernumber text pagenr
  1901. .toc@set \\$1 "\\$2" "\\$3" \\$4
  1902. \\..
  1903. ..
  1904. .\"-----------
  1905. .\" level mark text pagenumber
  1906. .de toc@set
  1907. .if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
  1908. .ne 2v
  1909. .na
  1910. .fi
  1911. .nr toc*ind 0
  1912. .nr toc*i 0 1
  1913. .ie d Ci \{\
  1914. .    nr toc*ind +\\n[toc*hl!\\$1]u
  1915. .\}
  1916. .el \{\
  1917. .    while \\n+[toc*i]<\\$1 \{\
  1918. .        nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
  1919. .    \}
  1920. .\}
  1921. .nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
  1922. .in \\n[toc*text]u
  1923. .ti -\\n[toc*hl!\\$1]u
  1924. .\"
  1925. .\" length of headernum space
  1926. .nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@
  1927. .\"
  1928. .ll \\n[@ll]u-\w@\\$4@u-2m
  1929. .\" ragged right ---------------------------------
  1930. .ie \\$1>\\n[toc*tlevel] \{\
  1931. \\$2
  1932. .    sp -1
  1933. \\$3\ \ \ \\$4
  1934. .    br
  1935. .\}
  1936. .el \{\
  1937. .    \" unnumbered heading --------------------
  1938. .    ie '\\$2'' \{\
  1939. .        in \\n[toc*ind]u
  1940. \\$3\h'1m'
  1941. .    \}
  1942. .    \" normal heading ------------------------
  1943. .    el \{\
  1944. \\$2
  1945. .        sp -1
  1946. \\$3\h'1m'
  1947. .    \}
  1948. .    ll \\n[@ll]u
  1949. .    sp -1
  1950. .    nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m
  1951. \h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
  1952. .\}
  1953. .ll \\n[@ll]u
  1954. ..
  1955. .\"########################### module lix ############################
  1956. .\" LIST OF figures, tables, exhibits and equations 
  1957. .nr lix*fg-nr 0 1
  1958. .nr lix*tb-nr 0 1
  1959. .nr lix*ec-nr 0 1
  1960. .nr lix*ex-nr 0 1
  1961. .aln Fg lix*fg-nr
  1962. .aln Tb lix*tb-nr
  1963. .aln Ec lix*ec-nr
  1964. .aln Ex lix*ex-nr
  1965. .\"------------
  1966. .de FG
  1967. .lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
  1968. ..
  1969. .de TB
  1970. .lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
  1971. ..
  1972. .de EC
  1973. .lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
  1974. ..
  1975. .de EX
  1976. .lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
  1977. ..
  1978. .\"------------
  1979. .\" print line with 'figure' in the text
  1980. .\" type stringvar number text override flag refname
  1981. .de lix@print-line
  1982. .ds lix*text "\\$4
  1983. .\"
  1984. .ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3
  1985. .el .ds lix*numb \\$3
  1986. .\"
  1987. .ie !\\n[Of] .ds lix*ds-form .\ \ \"
  1988. .el .ds lix*ds-form "\ \(em\ \"
  1989. .nr lix*in \\n[.i]
  1990. .ds lix*lable \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form]
  1991. .if !'\\$5'' \{\
  1992. .    if !0\\$6 .ds lix*lable \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form]
  1993. .    if 0\\$6=1 .ds lix*lable \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form]
  1994. .    if 0\\$6=2 .ds lix*lable \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
  1995. .\}
  1996. .ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg]
  1997. .el .ds lix*pgnr \\n[%]
  1998. .\" print line if not between DS/DE
  1999. .ie \\n[ds*lvl]<1 .lix@print-text "\\*[lix*lable]" "\\*[lix*text]"
  2000. .el .lix@embedded-text "\\*[lix*lable]" "\\*[lix*text]"
  2001. .\"
  2002. .\" save line for LIST OF XXX
  2003. .if !r lix*wth\\$1 .nr lix*wth\\$1 0
  2004. .if \w@\\*[lix*lable]@>\\n[lix*wth\\$1] .nr lix*wth\\$1 \w@\\*[lix*lable]@
  2005. .if \\n[\\$2] .lix@ds-save \\$1 \\*[lix*pgnr] "\\$4" "\\*[lix*lable]"
  2006. .if !'\\$7'' .SETR \\$7 \\*[lix*numb]
  2007. ..
  2008. .\"-----------
  2009. .de lix@print-text
  2010. .SP \\n[Lsp]u
  2011. .misc@ev-keep lix
  2012. .init@reset
  2013. .br
  2014. .ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
  2015. .    in +\w@\\$1@u
  2016. .    ti 0
  2017. .\}
  2018. .el .ce 1
  2019. \fB\\$1\fP\\$2
  2020. .br
  2021. .ev
  2022. ..
  2023. .\" hide printout until diversion is evaluated
  2024. .de lix@embedded-text
  2025. \!.SP \\n[Lsp]u
  2026. \!.misc@ev-keep lix
  2027. \!.init@reset
  2028. \!.br
  2029. \!.ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
  2030. \!.    in +\w@\\$1@u
  2031. \!.    ti 0
  2032. \!.\}
  2033. \!.el .ce 1
  2034. \!\fB\\$1\fP\\$2
  2035. \!.br
  2036. \!.ev
  2037. ..
  2038. .\"------------
  2039. .\" print complete list of XXXX
  2040. .de lix@print-ds
  2041. .\" arg: fg,tb,ec,ex text
  2042. .if !\\n[Cp] .pg@next-page
  2043. .\" print LIST OF XXXX
  2044. .ce
  2045. \\$2
  2046. .SP 3
  2047. .in \\n[lix*wth\\$1]u
  2048. .fi
  2049. .lix*ds\\$1
  2050. ..
  2051. .\"------------
  2052. .\" save line of list in macro
  2053. .de lix@ds-save
  2054. .\" type pagenumber text
  2055. .am lix*ds\\$1
  2056. .lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
  2057. \\..
  2058. ..
  2059. .\"------------
  2060. .\" print appended macro
  2061. .\" lix@dsln type pagenumber text headernr
  2062. .de lix@dsln
  2063. .nr lix*i \\n[lix*wth\\$1]-\w@\\$4@
  2064. .ne 2v
  2065. .ll -4m
  2066. .ti 0
  2067. \h'\\n[lix*i]u'\\$4\\$3
  2068. .sp -1
  2069. .ll
  2070. .ti \\n[.l]u-\w@\\$2@u
  2071. \\$2
  2072. ..
  2073. .\"########################### module fnt ############################
  2074. .\" some font macros.
  2075. .de R
  2076. .ft R
  2077. .ul 0
  2078. ..
  2079. .\"-----------
  2080. .de fnt@switch
  2081. .ul 0
  2082. .ds fnt*tmp
  2083. .nr fnt*prev \\n[.f]
  2084. .nr fnt*i 2 1
  2085. .while \\n+[fnt*i]<=\\n[.$] \{\
  2086. .    if \\n[fnt*i]>3 .as fnt*tmp \,
  2087. .    ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
  2088. .    el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
  2089. .    if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
  2090. .\}
  2091. \&\\*[fnt*tmp]\f[\\n[fnt*prev]]
  2092. ..
  2093. .\"-----------
  2094. .de B
  2095. .ie \\n[.$] .fnt@switch \fB \f[\\n[.f]] \\$@
  2096. .el .ft B
  2097. ..
  2098. .de I
  2099. .ie \\n[.$] .fnt@switch \fI \f[\\n[.f]] \\$@
  2100. .el .ft I
  2101. ..
  2102. .de IB
  2103. .if \\n[.$] .fnt@switch \fI \fB \\$@
  2104. ..
  2105. .de BI
  2106. .if \\n[.$] .fnt@switch \fB \fI \\$@
  2107. ..
  2108. .de IR
  2109. .if \\n[.$] .fnt@switch \fI \fR \\$@
  2110. ..
  2111. .de RI
  2112. .if \\n[.$] .fnt@switch \fR \fI \\$@
  2113. ..
  2114. .de RB
  2115. .if \\n[.$] .fnt@switch \fR \fB \\$@
  2116. ..
  2117. .de BR
  2118. .if \\n[.$] .fnt@switch \fB \fR \\$@
  2119. ..
  2120. .\"########################### module box ############################
  2121. .\" draw a box around some text. Text will be kept on the same page.
  2122. .\"
  2123. .nr box*ll 0
  2124. .\" .B1 and .B2 works like .DS
  2125. .de B1
  2126. .if \\n[box*ll] .@error "B1: missing B2"
  2127. .nr box*ll \\n[.l]
  2128. .nr box*ind \\n[.i]
  2129. .nr box*hyp \\n[.hy]
  2130. .in +1n
  2131. .ll -1n
  2132. .di box*div
  2133. .hy \\n[.hy]
  2134. ..
  2135. .de B2
  2136. .if !\\n[box*ll] .@error "B2: missing B1"
  2137. .br
  2138. .di
  2139. .nr box*height \\n[dn]
  2140. .ne \\n[dn]u+1v
  2141. .ev box*ev
  2142. .ll \\n[box*ll]u
  2143. .in 0
  2144. .nr box*y-pos \\n[.d]u
  2145. .nf
  2146. .box*div
  2147. .fi
  2148. \v'-1v+.25m'\
  2149. \D'l \\n[.l]u 0'\
  2150. \D'l 0 -\\n[box*height]u'\
  2151. \D'l -\\n[.l]u 0'\
  2152. \D'l 0 \\n[box*height]u'
  2153. .br
  2154. .sp -1
  2155. .ev
  2156. .sp .20v
  2157. .in \\n[box*ind]u
  2158. .ll \\n[box*ll]u
  2159. .rm box*div
  2160. .nr box*ll 0
  2161. ..
  2162. .\"########################### module ref ############################
  2163. .nr ref*nr 0 1
  2164. .nr ref*nr-width 5n
  2165. .ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
  2166. .\" start reference
  2167. .de RS
  2168. .if !''\\$1' .ds \\$1 \\n[ref*nr]
  2169. .ev ref*ev
  2170. .da ref*div
  2171. .init@reset
  2172. .ll \\n[@ll]u
  2173. .in \\n[ref*nr-width]u
  2174. .ti -(\w@\\n[ref*nr].@u+1n)
  2175. \\n[ref*nr].
  2176. .sp -1
  2177. ..
  2178. .de RF
  2179. .br
  2180. .if \\n[Ls] .SP \\n[Lsp]u
  2181. .di
  2182. .ev
  2183. ..
  2184. .de RP
  2185. .if !d ref*div .@error "RP: No references!"
  2186. .nr ref*i 0\\$2
  2187. .if \\n[ref*i]<2 .SK
  2188. .SP 2
  2189. .toc@save 1 "" "\\*[Rp]" \\n[%]
  2190. .ev ref*ev
  2191. .ce
  2192. \fI\\*[Rp]\fP
  2193. .sp
  2194. .in 0
  2195. .nf
  2196. .ref*div
  2197. .in
  2198. .if 0\\$1<1 .nr ref*nr 0 1
  2199. .rm ref*div
  2200. .ev
  2201. .if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK
  2202. ..
  2203. .\"########################### module app ############################
  2204. .\" 
  2205. .nr app*nr 0 1
  2206. .af app*nr A
  2207. .nr app*dnr 0 1
  2208. .\"------------
  2209. .\" .APP name text
  2210. .\" name == "" -> autonumber
  2211. .de APP
  2212. .\" .if \\n[.$]<2 .@error "APP: too few arguments"
  2213. .app@set-ind "\\$1"
  2214. .\"
  2215. .ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
  2216. .el .bp
  2217. .app@index "\\*[app*ind]" "\\$2"
  2218. ..
  2219. .\"------------
  2220. .\" .APPSK name pages text
  2221. .\" name == "" -> autonumber
  2222. .de APPSK
  2223. .if \\n[.$]<2 .@error "APPSK: too few arguments"
  2224. .app@set-ind "\\$1"
  2225. .\"
  2226. .ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
  2227. .el .bp
  2228. .app@index "\\*[app*ind]" "\\$3"
  2229. .pn +\\$2
  2230. ..
  2231. .\"------------
  2232. .de app@set-ind
  2233. .ie \w@\\$1@ .ds app*ind \\$1
  2234. .el \{\
  2235. .    if !\\n[app*dnr] \{\
  2236. .        nr H1 0 1
  2237. .        af H1 A
  2238. .    \}
  2239. .    ds app*ind \\n+[app*nr]
  2240. .    nr H1 \\n+[app*dnr]
  2241. .\}
  2242. .\"    clear lower counters
  2243. .nr app*i 1 1
  2244. .while \\n+[app*i]<8 .nr H\\n[app*i] 0 1
  2245. ..
  2246. .\"------------
  2247. .de app@index
  2248. .toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%]
  2249. ..
  2250. .\"------------
  2251. .\" app@heaer name text
  2252. .de app@header
  2253. .bp
  2254. .SP (u;\\n[Lsp]*4)
  2255. .ce 1
  2256. \s+4\fB\\*[App]\ \\$1\fP\s0
  2257. .SP (u;\\n[Lsp]*2)
  2258. .if \w@\\$2@<\\n[.l] .ce 1
  2259. \fB\s+2\\$2\s0\fP
  2260. .SP (u;\\n[Lsp]*4)
  2261. ..
  2262. .\"########################### module cov ############################
  2263. .\" title stored in diversion cov*title
  2264. .\" abstract stored in diversion cov*abstract
  2265. .\"    arg to abstract stored in cov*abs-arg
  2266. .\"    indent stored in cov*abs-ind
  2267. .\" number of authors stored in cov*au
  2268. .\" author(s) stored in cov*au!x!y
  2269. .\" author(s) title stored in cov*at!x!y
  2270. .\"     x is the author-index [1-cov*au], y is the argument-index [1-9].
  2271. .\" author(s) firm stored in cov*firm
  2272. .\" new date (if .ND exists) is stored in cov*new-date
  2273. .\"
  2274. .\"
  2275. .ds cov*abs-name ABSTRACT
  2276. .\"
  2277. .nr cov*au 0
  2278. .de TL
  2279. .if \\n[.$]>0 .ds cov*title-charge-case \\$1
  2280. .if \\n[.$]>1 .ds cov*title-file-case \\$2
  2281. .pg@disable-top-trap
  2282. .eo
  2283. .de cov*title AU
  2284. ..
  2285. .\"-------------------
  2286. .de cov@title-end
  2287. .ec
  2288. ..
  2289. .\"-------------------
  2290. .\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
  2291. .de AU
  2292. .cov@title-end
  2293. .pg@disable-top-trap
  2294. .if \\n[.$]<1 .@error "AU: no arguments"
  2295. .nr cov*au +1
  2296. .nr cov*i 0 1
  2297. .while \\n[.$]>=\\n+[cov*i] \{\
  2298. .    ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
  2299. .\}
  2300. .if (\\n[.$]>=3)&(\w@\\$3@) \{\
  2301. .    if d cov*location-\\$3] \{\
  2302. .        ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
  2303. .    \}
  2304. .\}
  2305. ..
  2306. .\"-------------------
  2307. .\" .AT title1 [title2 [... [title9] ]]]]
  2308. .\" Well, thats all that COVEND look for.
  2309. .\" Must appear directly after .AU
  2310. .de AT
  2311. .if \\n[.$]<1 .@error "AT: no arguments"
  2312. .nr cov*i 0 1
  2313. .while \\n[.$]>=\\n+[cov*i] \{\
  2314. .    ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
  2315. .\}
  2316. ..
  2317. .\"-------------------
  2318. .de AF
  2319. .cov@title-end
  2320. .if \\n[.$]<1 .@error "AF: no arguments"
  2321. .ds cov*firm \\$1
  2322. ..
  2323. .de AST
  2324. .ds cov*abs-name \\$1
  2325. ..
  2326. .de AS
  2327. .pg@disable-top-trap
  2328. .if d cov*abstract .@error "AS: only one abstract allowed"
  2329. .if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
  2330. .nr cov*abs-arg 0\\$1
  2331. .nr cov*abs-ind (n;0\\$2)
  2332. .de cov*abstract AE
  2333. ..
  2334. .de AE
  2335. ..
  2336. .\" I am planning to use mgm some time :-)
  2337. .ie \\n[yr]<50 .ds cov*new-date \\*[MO\\n[mo]] \\n[dy], 20\\n[yr]
  2338. .el .ds cov*new-date \\*[MO\\n[mo]] \\n[dy], 19\\n[yr]
  2339. .als DT cov*new-date
  2340. .de ND
  2341. .\" don't remember why I did this: .pg@disable-top-trap
  2342. .ds cov*new-date \\$1
  2343. ..
  2344. .\"-------------------
  2345. .\" save technical numbers.
  2346. .de TM
  2347. .nr cov*i 0 1
  2348. .while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
  2349. .nr cov*mt-tm-max \\n[.$]
  2350. ..
  2351. .\"-----------------------
  2352. .\" cover sheet
  2353. .\" the file must have the following last lines (somewhere):
  2354. .\" .pg@enable-top-trap
  2355. .\" .bp 1
  2356. .\" .pg@enable-trap
  2357. .ds cov*mt-file!0 0.MT
  2358. .ds cov*mt-file!1 0.MT
  2359. .ds cov*mt-file!2 0.MT
  2360. .ds cov*mt-file!3 0.MT
  2361. .ds cov*mt-file!4 4.MT
  2362. .ds cov*mt-file!5 5.MT
  2363. .ds cov*mt-file!6 0.MT
  2364. .\"------------
  2365. .de MT
  2366. .ie \\n[.$] \{\
  2367. .    ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
  2368. .    el .ds cov*mt-type 6
  2369. .\}
  2370. .el .ds cov*mt-type 1
  2371. .ds cov*mt-addresse "\\$2
  2372. .ds cov*mt-type-text "\\$1
  2373. .ie d @language .ds cov*str mm/\\*[@language]_
  2374. .el .ds cov*str mm/
  2375. .mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
  2376. ..
  2377. .de COVER
  2378. .ie !\\n[.$] .ds cov*cov-type ms
  2379. .el .ds cov*cov-type \\$1
  2380. .pg@disable-top-trap
  2381. .ie d @language .ds cov*str mm/\\*[@language]_\\*[cov*cov-type].cov
  2382. .el .ds cov*str mm/\\*[cov*cov-type].cov
  2383. .mso \\*[cov*str]
  2384. ..
  2385. .\"########################### module qrf ############################
  2386. .\" forward and backward reference thru special files.
  2387. .\"
  2388. .\" init reference system
  2389. .de INITR
  2390. .if \\n[.$]<1 .@error "INITR:filename missing"
  2391. .\" ignore if INITR has already been used
  2392. .if !r qrf*pass \{\
  2393. .\"
  2394. .    ds qrf*file \\$1
  2395. .    sy test -f \\*[qrf*file].tmp
  2396. .    ie \\n[systat] \{\
  2397. .        \" PASS 1
  2398. .        if \\n[D]=1 .tm PASS 1
  2399. .        if \\n[D]>1 .tm INITR: file \\*[qrf*file].tmp, PASS 1
  2400. .        nr qrf*pass 1
  2401. .        open qrf*stream \\*[qrf*file].tmp
  2402. .        write qrf*stream .\\\\" references for \\*[qrf*file]
  2403. .        close qrf*stream
  2404. .    \}
  2405. .    el \{\
  2406. .        nr qrf*pass 2
  2407. .        if \\n[D]=1 .tm PASS 2
  2408. .        if \\n[D]>1 .tm INITR: file \\*[qrf*file].tmp, PASS 2
  2409. .        sy mv  \\*[qrf*file].tmp  \\*[qrf*file].qrf
  2410. '        so  \\*[qrf*file].qrf
  2411. .    \}
  2412. .\}
  2413. ..
  2414. .\"---------------
  2415. .\" set a reference.
  2416. .de SETR
  2417. .if \\n[.$]<1 .@error "SETR:reference name missing"
  2418. .ie !r qrf*pass .tm "SETR: No .INITR in this file"
  2419. .el \{\
  2420. .    ds qrf*name qrf*ref-\\$1
  2421. .\" probably pass two if already defined
  2422. .    if \\n[qrf*pass]<2 \{\
  2423. .        if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*toc-mark],\\n[%]
  2424. .        \" heading-number
  2425. .        ds \\*[qrf*name]-hn \\*[hd*toc-mark]
  2426. .        \" page-number
  2427. .        ds \\*[qrf*name]-pn \\n[%]
  2428. .        \"
  2429. .        \" append to file
  2430. .        opena qrf*stream \\*[qrf*file].tmp
  2431. .        write qrf*stream .ds \\*[qrf*name]-hn \\*[hd*toc-mark]
  2432. .        write qrf*stream .ds \\*[qrf*name]-pn \\n[%]
  2433. .        if !'\\$2'' .write qrf*stream .ds \\*[qrf*name]-xx \\$2
  2434. .        close qrf*stream
  2435. .    \}
  2436. .\}
  2437. ..
  2438. .\"---------------
  2439. .\" get misc-string, output <->42<-> in pass 1
  2440. .\" If two arg -> set var. arg to misc-string.
  2441. .de GETST
  2442. .if \\n[.$]<1 .@error "GETST:reference name missing"
  2443. .if !r qrf*pass .tm "GETST: No .INITR in this file"
  2444. .ds qrf*name qrf*ref-\\$1
  2445. .ie \\n[qrf*pass]=2 \{\
  2446. .    ie !d \\*[qrf*name]-xx .tm "GETHN:\\$1 not defined"
  2447. .    el \{\
  2448. .        ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
  2449. .        el \\*[\\*[qrf*name]-xx]\c
  2450. .    \}
  2451. .\}
  2452. .\" The answer...
  2453. .el <->42<->\c
  2454. ..
  2455. .\"---------------
  2456. .\" get header-number, output X.X.X. in pass 1
  2457. .\" If two arg -> set var. arg to header-number.
  2458. .de GETHN
  2459. .if \\n[.$]<1 .@error "GETHN:reference name missing"
  2460. .if !r qrf*pass .tm "GETHN: No .INITR in this file"
  2461. .ds qrf*name qrf*ref-\\$1
  2462. .ie \\n[qrf*pass]=2 \{\
  2463. .    ie !d \\*[qrf*name]-hn .tm "GETHN:\\$1 not defined"
  2464. .    el \{\
  2465. .        ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
  2466. .        el \\*[\\*[qrf*name]-hn]\c
  2467. .    \}
  2468. .\}
  2469. .el X.X.X.\c
  2470. ..
  2471. .\"---------------
  2472. .\" get page-number, output 9999 in pass 1
  2473. .\" If two arg -> set var. arg to page-number.
  2474. .de GETPN
  2475. .if \\n[.$]<1 .@error "GETPN:reference name missing"
  2476. .if !r qrf*pass .tm "GETPN: No .INITR in this file"
  2477. .ds qrf*name qrf*ref-\\$1
  2478. .ie \\n[qrf*pass]=2 \{\
  2479. .    ie !d \\*[qrf*name]-pn .tm "GETPN:\\$1 not defined"
  2480. .    el \{\
  2481. .        ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
  2482. .        el \\*[\\*[qrf*name]-pn]\c
  2483. .    \}
  2484. .\}
  2485. .el 9999\c
  2486. ..
  2487. .\"----------
  2488. .de GETR
  2489. .if \\n[.$]<1 .@error "GETR:reference name missing"
  2490. .ie !r qrf*pass \{\
  2491. .    tm "GETR: No .INITR in this file"
  2492. .\}
  2493. .el \{\
  2494. .    if \\n[qrf*pass]=2 \{\
  2495. .        GETHN \\$1 Qrfh
  2496. .        GETPN \\$1 Qrfp
  2497. \\*[Qrf]
  2498. .    \}
  2499. .\}
  2500. ..
  2501.